package com.rao.gmall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rao.gmall.model.product.BaseAttrInfo;
import com.rao.gmall.model.product.BaseAttrValue;
import com.rao.gmall.product.mapper.BaseAttrInfoMapper;
import com.rao.gmall.product.mapper.BaseAttrValueMapper;
import com.rao.gmall.product.service.BaseAttrInfoService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author nzmxfan
 * @create 2021-08-02-18:46
 */
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo> implements BaseAttrInfoService {

    @Resource
    BaseAttrInfoMapper baseAttrInfoMapper;

    @Resource
    BaseAttrValueMapper baseAttrValueMapper;


    @Override
    public List<BaseAttrInfo> getBaseAttrList(Long category1Id, Long category2Id, Long category3Id) {

        return baseAttrInfoMapper.getBaseAttrList(category1Id, category2Id, category3Id);
    }

    @Override
    public void saveOrUpdateAttrInfo(BaseAttrInfo baseAttrInfo) {

        if (baseAttrInfo.getId() != null) {
            // 如果 id 存在，则进行更新操作
            updateBaseAttrInfo(baseAttrInfo);
        } else {
            // 如果 id 不存在，则进行添加操作
            saveAttrInfo(baseAttrInfo);
        }
    }

    /**
     * 更新平台属性名与属性值
     *
     * @param baseAttrInfo 平台属性名
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateBaseAttrInfo(BaseAttrInfo baseAttrInfo) {
        // 更新属性名
        baseAttrInfoMapper.updateById(baseAttrInfo);
        // 获取属性 id
        Long id = baseAttrInfo.getId();

        // 属性值更新
        List<BaseAttrValue> attrValueList = baseAttrInfo.getAttrValueList();

        // 根据 attr_id 属性名的 id 移除之前的属性值
        QueryWrapper<BaseAttrValue> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("attr_id", baseAttrInfo.getId());
        baseAttrValueMapper.delete(queryWrapper);

        // 添加新的属性值
        for (BaseAttrValue baseAttrValue : attrValueList) {
            baseAttrValue.setAttrId(id);
            baseAttrValueMapper.insert(baseAttrValue);
        }
    }

    /**
     * 保存平台属性值与属性名
     * @param baseAttrInfo 平台属性名
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveAttrInfo(BaseAttrInfo baseAttrInfo) {
        // 保存属性名
        baseAttrInfoMapper.insert(baseAttrInfo);
        // 获取保存的记录的 id
        Long id = baseAttrInfo.getId();
        // 保存属性值，使值与名对应
        List<BaseAttrValue> attrValueList = baseAttrInfo.getAttrValueList();
        if (!CollectionUtils.isEmpty(attrValueList)) {
            for (BaseAttrValue baseAttrValue : attrValueList) {

                baseAttrValue.setAttrId(id);
                baseAttrValueMapper.insert(baseAttrValue);
            }
        }
    }
}
